package game;

import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

import rps.RPSClient;

public class Modelo {

	public static int APUNTANDO = 0;
	public static int LANZANDO = 1;
	public static int FIN_JUEGO = 2;
	public static int RETARDO = 3;
	public static boolean sonido = false;

	private Bolo bolos[] = { new Bolo(-85, -95), new Bolo(-30, -95),
			new Bolo(30, -95), new Bolo(85, -95), new Bolo(-55, -90),
			new Bolo(0, -90), new Bolo(55, -90), new Bolo(-30, -85),
			new Bolo(30, -85), new Bolo(0, -80) };

	private Flecha flecha = new Flecha();
	private static Bola bola = new Bola();
	private Puntuacion puntos = new Puntuacion();
	private int velocidad = 1;
	private static int estado;
	private int nDv = 1;
	private int nContarRetardo;
	private static boolean bloqueado;
	private static int estadoSer=0;
	private static int dxSer=0;
	private static int drSer=0;

	public Flecha getFlecha() {
		return flecha;
	}

	public static boolean isBloqueado() {
		return bloqueado;
	}

	public static void setBloqueado(boolean bloqueado) {
		Modelo.bloqueado = bloqueado;
	}

	public int getVelocidad() {
		return velocidad;
	}

	public Bolo[] getBolos() {
		return bolos;
	}

	public Puntuacion getPuntos() {
		return puntos;
	}

	public void iniciarPartida() {
		puntos.iniciarPuntos();
		levantarBolos();
		estado = APUNTANDO;
		nContarRetardo = 0;
	}

	public void levantarBolos() {
		for (Bolo b : bolos) {
			b.levantaBolo();
		}
	}

	public void moverModelo() {
		if (algunBoloTirado() && !sonido) {
			sonidoChuza();
			sonido = true;
		}
		switch (estado) {
		case 0:
			flecha.moverFlecha();
			velocidad += nDv;
			if (velocidad == 13 || velocidad == 1)
				nDv = -nDv;
			break;
		case 1:
			bola.moverBola();

			for (Bolo b : bolos)
				b.moverBolo();
			detectarColisiones();

			if (hayMovimiento() == false) {
				nContarRetardo = 10;
				estado = RETARDO;
			}

			break;
		case 3:
			nContarRetardo--;			
			if (nContarRetardo == 0) {
					anotarPuntos();
			}
		}
	}

	private void quitarBolosTirados() {
		for (Bolo b : bolos)
			b.quitarBolo();
	}

	public boolean hayMovimiento() {
		boolean movimiento = bola.isVisible();
		return movimiento;
	}

	public Bola getBola() {
		return bola;
	}

	public int getEstado() {
		return estado;
	}

	public void lanzarBola(RPSClient client, boolean bloqueo) {
		this.bloqueado=bloqueo;
		System.err.println("bloqueo en lanzar bola"+bloqueo);
		sonido = false;// se reinicia el sonido
		if (estado == APUNTANDO) {			
			client.lanzar(flecha.getX(), flecha.getAngulo(), velocidad);
		}
		System.err.println("...........bloqueado en lanzar bola"+bloqueado);
	}	
	
	public static void lanzarBola(int nX, double nAngulo, int nVelocidad, int estadoS, int dxS, int drS)
	{
		estadoSer=estadoS;
		dxSer=dxS;
		drSer=drS;
		
		//if(!bloqueado)
		//{
			bola.lanzarBola(nX, nAngulo, nVelocidad);
			estado = LANZANDO;
		//}
	}

	private void detectarColisiones() {
		int x = bola.getX();
		int y = bola.getY();
		int vel = bola.getVelocidad();
		boolean bPuedeColisionar = true;
		for (int n = -1; n < bolos.length; n++) {
			if (n >= 0) {
				if (bolos[n].estaTumbado()) {
					x = bolos[n].getX();
					y = bolos[n].getY();
					vel = bolos[n].getVelocidad();
					bPuedeColisionar = true;
				} else
					bPuedeColisionar = false;
			}
			if (bPuedeColisionar)
				for (int m = 0; m < bolos.length; m++)
					bolos[m].comprobarColision(x, y, vel,estadoSer,dxSer,drSer);
		}
	}

	private boolean algunBoloTirado() {
		for (int m = 0; m < bolos.length; m++)
			if (bolos[m].isPendienteDeApuntar())
				return true;
		
		if (puntos.isSonidoSinAnotar())
			return true;
		
		return false;
	}

	private void anotarPuntos() {
		System.err.print("en anotar bloqueado --> "+bloqueado);
		int nBolosTirados = 0;
		for (Bolo b : bolos)
			if (b.isPendienteDeApuntar())
				nBolosTirados++;
		quitarBolosTirados();
		if (puntos.anotarPuntos(nBolosTirados,this.bloqueado))
			levantarBolos();
		if (puntos.haFinalizado())
			estado = FIN_JUEGO;
		else
			estado = APUNTANDO;
	}

	private void sonidoChuza() {
		Clip sonidoChuza = null;
		try {
			sonidoChuza = AudioSystem.getClip();
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		}
		try {
			sonidoChuza.open(AudioSystem.getAudioInputStream(new File(
					"sonido/chuza.wav")));
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
		}
		sonidoChuza.loop(0); // lo reproduce infinitamente.
	}
}
